package com.lingyun.financialmanagement.utils;


import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;

import javax.crypto.SecretKey;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Slf4j
public class JWTUtils {

    // 加密盐
    private static final String jwtToken = "123456wjp!@#$$sdfsafdasdfafsdfasdf";

    @Getter
    // 获取token值的名字
    private static final String ClaimsKey = "account";

    /**
     * 创建token
     * @param userId
     * @return
     */
    public static String createToken(String userId){
        // 自定义声明
        Map<String,Object> claims = new HashMap<>();
        claims.put(ClaimsKey ,userId);

        // 将密钥转换为SecretKey对象
        SecretKey secretKey = Keys.hmacShaKeyFor(jwtToken.getBytes());

        // 转为token
        String token = Jwts.builder()
                .setClaims(claims)      // 自行设置body数据
                .signWith(secretKey, SignatureAlgorithm.HS256)   // 签发算法，密钥为jwtToken
                .setIssuedAt(new Date())    // 设置签发时间
                .setExpiration(new Date(System.currentTimeMillis() + 365L * 24 * 60 * 60 * 1000)) // 一天的有效时间
                .compact();

        return token;
    }

    /**
     * 验证token
     * @param token
     * @return
     */
    public static Map<String,Object> checkToken(String token){
        try{
            // 将token转为key
            SecretKey secretKey = Keys.hmacShaKeyFor(jwtToken.getBytes());

            Jws<Claims> jws = Jwts.parser()
                    .verifyWith(secretKey)
                    // 设置签名
//                    .setSigningKey(secretKey)
                    .build()
                    .parseSignedClaims(token);
                    // 解析后的jws输出
//                    .parseClaimsJws(token);
            Claims payload = jws.getPayload();
            return new HashMap<String,Object>(payload);
        }catch (Exception e){
            log.info(e.getMessage());
            log.info("校验错误：{}", e.getMessage());
            return null;
        }
    }

    /**
     * Token的解密
     * @param token 加密后的token
     * @return
     */
    public static Claims parseJWT(String token) {

        // 将密钥转换为 SecretKey
        SecretKey key = Keys.hmacShaKeyFor(jwtToken.getBytes());

        try{
            //得到DefaultJwtParser
            Claims claims = Jwts.parser()
                    // 验证密钥
                    .verifyWith(key)
                    .build()
                    .parseSignedClaims(token)   // 解析签名后的token
                    .getPayload();

            return claims;
        } catch (Exception e){
            log.info(e.getMessage());
            return null;
        }
    }
}